package junior.其他;

public class No1 {
    //                位1的个数
    //  编写一个函数，输入是一个无符号整数（以二进制串的形式），返回其二进制表达式中数字位数为 '1' 的个数（也被称为汉明重量）。
    //提示：
    //
    //    请注意，在某些语言（如 Java）中，没有无符号整数类型。在这种情况下，输入和输出都将被指定为有符号整数类型，并且不应影响您的实现，因为无论整数是有符号的还是无符号的，其内部的二进制表示形式都是相同的。
    //    在 Java 中，编译器使用二进制补码记法来表示有符号整数。因此，在上面的 示例 3 中，输入表示有符号整数 -3。

    //----------------------------------------------------------------------------------------------------
    //                          失败
    //思想：一共32位，最大也就是2的32次方减一。于是可以采用余数运算，第一次余2然后再减去这个余数，第二次余2的2次方，直到余2的32次方
    /*
    public int hammingWeight(int n) {
        int temp = n,res = 0;
        double rem,j;
        for (int i = 1; i <= 32; i++) {
            j = Math.pow(10,i);
            rem = temp % j;

            if (rem != 0 && rem / j == 0) {
                //说明是正负一
                res++;
            }

            temp -= rem;
        }
        return res;
    }
    */
    //-----------------------------------------------------------------------------------------------------

    //-----------------------------------------------------------------------------------------------------
    //                  正确解法：位运算
    //不会写的原因：没有真正所有位运算的原理，&1运算时，因为1只有最后一位是一，其他位都是零，所以就能够检验出当前数的最后一位是否为1；
    public int hammingWeight(int n){
        int temp = n,res = 0;
        for (int i = 1; i <= 32; i++) {

            if ((temp & 1) == 1) {
                //说明是正负一
                res++;
            }
            temp = temp >> 1;
        }
        return res;
    }
    //-----------------------------------------------------------------------------------------------------
}
